문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 참조에 의한 호출 (문단 편집) === 코드를 이용한 비교 === C언어의 창시자 [[데니스 리치]]가 쓴 The C Programming Language를 보면, 값에 의한 호출 단락에서 다음과 같이 참조에 의한 호출을 설명하고 있다. >..."call by reference"..., in which the called routine has access to the original argument, not a local copy. 함수 호출 과정에서 어떤 변수를 전달한다고 할 때, 이 변수를 호출부에서는 인자(Argument), 또는 실 매개변수(Actual Parameter)라고 하며 피호출부에서는 매개변수(Parameter), 또는 형식 매개변수(Formal Parameter)라고 한다. 일반적으로 '매개변수'라 하면 '형식 매개변수'를 뜻한다. 위에 서술된 설명은 호출된 함수가 '''인자'''에 접근할 수 있는 것이 참조에 의한 호출이라는 말이다. 아래의 C++ 코드를 보자. {{{#!syntax cpp void testFunc(int& pRef) { pRef = 20; } int main(void) { int num = 0; int& ref = num; cout << ref << endl; testFunc(ref); cout << ref << endl; } }}} > 0 > 20 함수 testFunc 안에서 참조자 매개변수 pRef에 20을 대입했더니, main 함수에서 전달된 '''인자''' ref의 값이 0에서 20으로 변경되었다. 즉 부수 작용이 일어났다. 이런 게 가능해야 참조에 의한 호출이 지원되는 언어라고 할 수 있다. 이걸 포인터로 변환하면 어떻게 될까? {{{#!syntax cpp void testFunc(int* pPtr) { pPtr = NULL; } int main(void) { int num = 0; int* ptr = # cout << ptr << endl; testFunc(ptr); cout << ptr << endl; } }}} > 0x65fe44 > 0x65fe44 함수 testFunc 안에서 포인터 매개변수 pPtr에 NULL을 대입했지만, main 함수에서 전달된 '''인자''' ptr의 값은 변하지 않았다. 이 코드에서 testFunc 함수를 통해 ptr에 저장된 값을 변경할 수 있는 방법은 없다. ptr에 저장된 값은 main 함수에 선언된 num의 주소값인데, ptr의 값을 바꾼다는 것은 pPtr을 이용해서 ptr이 num이 아닌 다른 변수를 가리키도록 만든다는 뜻이기 때문이다. 그러나 그런 것은 불가능하다. 참조자의 예시에서 pRef에 20을 대입하면 main 함수의 num의 값도 20이 되는데, 마찬가지로 포인터의 예시에서 testFunc 함수 안에 '*pPtr = 20;'이라는 식을 추가하면 main 함수의 num의 값이 20으로 바뀐다. 하지만 이는 역참조 연산자(*, Dereference Operator)를 이용한 절대 주소로 num에 접근한 것이지 인자 ptr 자체의 값이 바뀐 것은 아니다. 포인터를 이용해서 참조에 의한 호출 흉내냈을(Simulate) 뿐이다. 따라서, 참조자가 없고 포인터만 존재하는 C언어에는 참조에 의한 호출이 '''존재하지 않는다'''는 결론을 내릴 수 있다. C에서 참조에 의한 호출을 가장 가깝게 흉내 내려면 이중 포인터를 사용하여 포인터 변수의 내용이 아닌 주소 자체를 넘기면 된다. {{{#!syntax cpp #include // printf() void testFunc(int** pPtr) { *pPtr = NULL; // Dereferencing. main()의 int* ptr := NULL } int main(void) { int num = 0; int* ptr = # printf("%p \n", ptr); testFunc(&ptr); // int* ptr; 의 내용이 아닌 주소 자체를 전달한다. printf("%p", ptr); } }}} > 000000bd7d7ffb5c > 0000000000000000 [[분류:프로그래밍 이론]]저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기